--			元表


-- 			元表的概念
-- 1、任何表变量都可以作为另一个表变量的元表
-- 2、任何表变量都可以有自己的元表
-- 3、当我们子表中进行一些特定的操作时，会执行元表中的内容


-- 			设置元表
child={}
parent={}
-- 设置元表函数
setmetatable(child,parent)

-- 			特定操作
-- 			tostring
child2={
	name="bbb"
}
parent2={
	-- 当子表要被当做字符串使用时，会默认调用元表中的tostring方法
	__tostring=function (t)
		return t.name
	end
}
-- 设置元表函数
setmetatable(child2,parent2)
print(child2)

-- 			__call
child3={
	name="bbb"
}
parent3={
	-- 当子表要被当做字符串使用时，会默认调用元表中的tostring方法
	__tostring=function (t)
		return t.name
	end,
	-- 当子表被当做一个函数使用时，会默认调用__call中的内容(第一个参数是调用者自己，第二是传入参数)
	__call=function (a,b)
		print(a)
		print(b)
		print("__call")
	end
}
-- 设置元表函数
setmetatable(child3,parent3) 
child3(2);

-- 			运算符重载

-- 			__index和__newIndex
-- 				__index
child4={
	
} 
parent4={
 	age="parent4"
}
parent4.__index=parent4
-- __index  当子表中找不到某个属性时，会在元表中 __index指定的表去找索引
setmetatable(child4,parent4) 
print(child4.age)

-- 				__newIndex
-- __newIndex  当赋值时，如果赋值一个不存在的索引，那么会把这个值赋值到newIndex所指的表中，不会修改自己
child5={
	
} 
parent5={
 	 
}
parent5.__newIndex={} 
setmetatable(child5,parent5) 
child5.age=101
print(child5.age)